package it.traveldream.ManagedBeans;


import it.traveldream.EJB.CityCountryBean;
import it.traveldream.EJB.GiftBean;
import it.traveldream.EJB.PacketBeanEJB;
import it.traveldream.EJB.SBEJBBean;
import it.traveldream.EJB.DTO.AcquistoDTO;
import it.traveldream.EJB.DTO.CategoriaDTO;
import it.traveldream.EJB.DTO.CittaDTO;
import it.traveldream.EJB.DTO.EscursioneDTO;
import it.traveldream.EJB.DTO.GiftListDTO;
import it.traveldream.EJB.DTO.PacchettoDTO;
import it.traveldream.EJB.DTO.StatoDTO;
import it.traveldream.EJB.DTO.UtenteDTO;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.servlet.http.HttpServletRequest;


@ManagedBean(name="pacchettoBean")
@SessionScoped
@FacesConverter(value="convertCat")
public class PacketBean implements Converter{
	
	

	@EJB
	private PacketBeanEJB ejbSession;

	@EJB
	private CityCountryBean cityejb;

	@EJB
	private SBEJBBean sbEJB;

	@EJB
	private GiftBean gLEJB;

	//serve per inserire tutti i servizi base del pacchetto che si 
	//vuole inserire nella giftList
	private ArrayList<GiftListDTO> listaGiftList;

	private ArrayList<PacchettoDTO> listaPacchetti;


	private ArrayList<PacchettoDTO> listaPacchettiFiltrati;

	//DTO Utilizzato per la gestione del pacchetto selezionato dalla lista dei pacchetti
	private PacchettoDTO pacchettoSelezionato;

	private CategoriaDTO nuovaCategoria;

	//DTO Utilizzato per la creazione di un nuovo pacchetto
	private PacchettoDTO nuovoPacchetto;

	private int numeroPersNuovoPacchetto = 1;


	//Variabile usata per la scelta della categoria durante la creazione di un nuovo pacchetto
	private ArrayList<CategoriaDTO> listaCategorie;

	//DTO per il filtering dei pacchetti

	private CittaDTO cittaSelezionata;
	
	private StatoDTO statoSel;

	private double prezzoMax, prezzoMin;

	private CategoriaDTO categoriaSelezionata;

	private Date dataPartenza, dataRitorno;


	//Variabili di stato per la visualizzazione

	private Date CURRENT_DATE;

	private double maxPrezzoPack;



	public PacketBean() {
		nuovoPacchetto = new PacchettoDTO();
		listaPacchetti = new ArrayList<PacchettoDTO>();
		listaPacchettiFiltrati = new ArrayList<PacchettoDTO>();
		cittaSelezionata = new CittaDTO();
		statoSel = new StatoDTO();
		prezzoMin = 0;
		prezzoMax = Integer.MAX_VALUE;
		maxPrezzoPack = 10000;
		pacchettoSelezionato = new PacchettoDTO();
		setCURRENT_DATE(new Date());
		setListaCategorie(new ArrayList<CategoriaDTO>());
		setNuovaCategoria(new CategoriaDTO());
		categoriaSelezionata = new CategoriaDTO();
		listaGiftList = new ArrayList<GiftListDTO>();

	}



	/**
	 * 
	 * Metodo che carica dal server l'{@link ArrayList} dei pacchetti presenti nel server
	 * 
	 */
	public void obtainListaPacchettiImpiegato(){
		listaCategorie = ejbSession.getAllCategorie();


		System.out.println("Managed Bean :Packet: - obtain lista pacchetti");
		ArrayList<PacchettoDTO> p1 = ejbSession.getPacketList();

		listaPacchetti.clear();
		listaPacchetti.addAll(p1);
		listaPacchettiFiltrati.clear();
		listaPacchettiFiltrati.addAll(p1);
		filtraPacchetti();

	}

	/**
	 * 
	 * Metodo che carica dal server l'{@link ArrayList} dei pacchetti da visualizzare al cliente 
	 * 
	 */
	public void obtainListaPacchettiCliente(){

		listaCategorie = ejbSession.getAllCategorie();
		
		System.out.println("Managed Bean :Packet: - obtain lista pacchetti");
		ArrayList<PacchettoDTO> help =
				ejbSession.getPacketListCliente(FacesContext.getCurrentInstance()
						.getExternalContext().getUserPrincipal().getName());
		listaPacchettiFiltrati.clear();
		listaPacchettiFiltrati.addAll(help);
		listaPacchetti.clear();
		listaPacchetti.addAll(help);
		System.out.print(help.size());
		filtraPacchetti();
	}



	/**
	 * 
	 * Metodo che carica dal server l'{@link ArrayList} dei pacchetti acquistati da un certo cliente
	 *  da visualizzare
	 * 
	 */
	public void obtainListaAcquistatiCliente(){

		listaCategorie = ejbSession.getAllCategorie();
		
		System.out.println("Managed Bean :Packet: - obtain lista pacchetti");
		UtenteDTO u = new UtenteDTO();
		u.setUsername(FacesContext.getCurrentInstance()
				.getExternalContext().getUserPrincipal().getName());

		ArrayList<AcquistoDTO> listaAcquisti =						//Recupero tutti i dati degli acquisti per l'utente corrente
				ejbSession.getAcquistiForUser(u);


		//Riempio la lista di tutti i pacchetti da visualizzare, estraendoli dalla lista
		//degli acquisti.
		Iterator<AcquistoDTO> it = listaAcquisti.iterator();
		listaPacchetti.clear();
		while(it.hasNext())
			listaPacchetti.add(it.next().getPacchetto());


		listaPacchettiFiltrati.clear();
		listaPacchettiFiltrati.addAll(listaPacchetti);

		System.out.print("Pacchetti Acquistati da " +
				FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName() + ": " + listaPacchettiFiltrati.size());
		filtraPacchetti();
	}






	/**
	 * 
	 * Metodo utilizzato per "pulire" i dati del nuovo pacchetto che si sta inserendo 
	 * utilizzato per contenere i nuovi dati inseriti
	 */
	public void clearNuovoPacchetto(){
		nuovoPacchetto = new PacchettoDTO();
		nuovaCategoria = new CategoriaDTO();	//Elimino anche i dati della nuova categoria eventualmente create contestualmente al pacchetto
	}


	/**
	 * 
	 * Metodo che permette di modificare il pacchetto con ID in pacchettoSelezionato
	 * con i dati inseriti in pacchettoSelezionato e ritorna l'action per il "flow" nelle pagine di modifica
	 */
	public String editPacchetto(){

		HttpServletRequest origRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();

		if(origRequest.getServletPath().contains("edit_packet_alloggio")){
			try {
				ejbSession.updatePacchetto(pacchettoSelezionato);
				FacesContext.getCurrentInstance().addMessage("edit_pacchetto_growl",
						new FacesMessage( "SUCCESFULLY", "Pacchetto eliminato correttamente"));
			} catch (Exception e) {
				FacesContext.getCurrentInstance().addMessage("edit_pacchetto_growl",
						new FacesMessage( "ERRORE", e.getMessage().substring(0, e.getMessage().indexOf(":"))));
				System.out.print(e.getMessage());
			}
		}
		System.out.println("Edit del pacchetto: " + pacchettoSelezionato.getId() +
				"Citta: " + pacchettoSelezionato.getCitta().getName() + 
				"Da: " + pacchettoSelezionato.getdataPartenzaAsString() + 
				"A: " + pacchettoSelezionato.getdataRitornoAsString() + 
				"Prezzo" + pacchettoSelezionato.getPrezzo());

		if(pacchettoSelezionato.getTrasportAndata() != null){
			System.out.println("Trasporto Andata: \n" +
					"Da: "+ pacchettoSelezionato.getTrasportAndata().getCittaPartenza().getName()+ " a: " + pacchettoSelezionato.getTrasportAndata().getCittaArrivo().getName()
					+ "\n Data: " + pacchettoSelezionato.getTrasportAndata().getDataAsString());
		}

		if(pacchettoSelezionato.getTrasportRitorno() != null){
			System.out.println("Trasporto Andata: \n" +
					"Da: "+ pacchettoSelezionato.getTrasportRitorno().getCittaPartenza().getName()+ " a: " + pacchettoSelezionato.getTrasportRitorno().getCittaArrivo().getName()
					+ "\n Data: " + pacchettoSelezionato.getTrasportRitorno().getDataAsString());
		}

		if(pacchettoSelezionato.getEscursionis() != null){
			System.out.println("Escursioni:");
			for(EscursioneDTO c : pacchettoSelezionato.getEscursionis()){
				System.out.println(c.getDescrizione());
			}
		}else {
			System.out.print("Escursioni: " + pacchettoSelezionato.getEscursionis());
		}


		return "edit_packet_next";
	}


	/**
	 * Metodo che permette di filtrare i pacchetti della pagina packet_list
	 * 
	 */
	public void filtraPacchetti(){


		ArrayList<PacchettoDTO> listaFiltrata = new ArrayList<PacchettoDTO>();
		Iterator<PacchettoDTO> it = listaPacchetti.iterator();
		PacchettoDTO help = new PacchettoDTO();
		listaPacchettiFiltrati.clear();
		listaPacchettiFiltrati.addAll(listaPacchetti);

		//Filtro per citta
		if(cittaSelezionata != null && cittaSelezionata.getName() != null && cittaSelezionata.getName().length() > 0 ){
			while(it.hasNext()){
				help = it.next();
				if(help.getCitta().getId() == cittaSelezionata.getId())
					listaFiltrata.add(help);
			}
			listaPacchettiFiltrati.clear();
			listaPacchettiFiltrati.addAll(listaFiltrata);
		}
		
		//filtro per stato
		if(statoSel != null && statoSel.getName() != null &&
				statoSel.getCode().length() > 0){
			
			listaFiltrata.clear();
			it = listaPacchettiFiltrati.iterator();
			while(it.hasNext()){
				help = it.next();
				if(help.getCitta().getStati().getCode().equalsIgnoreCase(statoSel.getCode()))
					listaFiltrata.add(help);
			}
			listaPacchettiFiltrati.clear();
			listaPacchettiFiltrati.addAll(listaFiltrata);
			
		}

		//Filtro per categoria

		if(categoriaSelezionata != null && categoriaSelezionata.getDescrizione() != null &&
				categoriaSelezionata.getDescrizione().length() > 0 ){
			listaFiltrata.clear();
			it = listaPacchettiFiltrati.iterator();
			while(it.hasNext()){
				help = it.next();
				if(help.getCategorie().getIdCategoria() == categoriaSelezionata.getIdCategoria())
					listaFiltrata.add(help);
			}
			listaPacchettiFiltrati.clear();
			listaPacchettiFiltrati.addAll(listaFiltrata);
		}

		//Filtro per prezzo
		listaFiltrata.clear();
		it = listaPacchettiFiltrati.iterator();
		System.out.println(prezzoMin + " : " + prezzoMax);
		while(it.hasNext()){
			help = it.next();
			System.out.println(prezzoMin + "<= "+ help.getCitta().getName() + "." + help.getPrezzoScontato() + " : " + prezzoMax);
			if(help.getPrezzoScontato() <= this.prezzoMax && help.getPrezzoScontato() >= this.prezzoMin)
				listaFiltrata.add(help);
		}

		listaPacchettiFiltrati.clear();
		listaPacchettiFiltrati.addAll(listaFiltrata);



		//Filtro per data
		listaFiltrata.clear();
		it = listaPacchettiFiltrati.iterator();
		while(it.hasNext()){
			help = it.next();
			System.out.println(dataPartenza +"  :  "+dataRitorno);
			if(( dataPartenza == null || dataPartenza.compareTo(help.getPartenza()) == 0) &&
					(dataRitorno == null || dataRitorno.compareTo(help.getRitorno()) == 0))
				listaFiltrata.add(help);
		}


		if(dataPartenza != null || dataRitorno != null){
			listaPacchettiFiltrati.clear();
			listaPacchettiFiltrati.addAll(listaFiltrata);
		}



		//ordino i pacchetti filtrati in ordine decrescente di prezzo, per recuperare il prezzo max
		Collections.sort(listaPacchettiFiltrati, new Comparator<PacchettoDTO>() {
			//SO SIMPLE!
			@Override
			public int compare(PacchettoDTO o1, PacchettoDTO o2) {
				if(o1.getPrezzo()<o2.getPrezzo()) return 1;
				if(o1.getPrezzo()>o2.getPrezzo()) return -1;
				return 0;
			}
		});

		
		if(listaPacchettiFiltrati.size()>0)
			this.maxPrezzoPack = listaPacchettiFiltrati.get(0).getPrezzo() + 500;
		else
			this.maxPrezzoPack = 1000;



		System.out.println("Managed Bean :Packet: - pacchetti filtrati "+listaPacchettiFiltrati.size() + "   " + maxPrezzoPack);
	}

	/**
	 * Metodo che permette di effettuare la ricerca di un pacchetto
	 * via id (id definito dagli opportuni metodi EJB) e ritorna l'action relativa
	 * 
	 * @param id - identificativo del pacchetto
	 */

	public String cercaPacchettoViaID(String id){


		System.out.println("Managed Bean :Packet: - Pacchetto da cercare via ID: "+ id);

		if(!id.startsWith("PoliTravelDream") || id.length()<21){
			FacesContext.getCurrentInstance().addMessage("packet_search_id", 
					new FacesMessage(FacesMessage.SEVERITY_WARN, "Id inserito non valido","Id inserito non valido"));
			return "#";
		}
		System.err.print("CercameloOooooo!");
		//Chiamo direttamente il metodo che recupera i dati dal DB del pacchetto corrispondente all'ID dato
		//l'info sull'id da cercare si trova già in pacchettoSelezionato (vedi variabili private)
		PacchettoDTO p = new PacchettoDTO();
		p.setRealId(id);		//Costruisco il pacchetto con l'ID inserito dall'utente
		pacchettoSelezionato = ejbSession.getPacketById(p); 

		if(pacchettoSelezionato == null){
			FacesContext.getCurrentInstance().addMessage("packet_search_id", 
					new FacesMessage(FacesMessage.SEVERITY_WARN, "Non esiste pacchetto con l'id fornito","Non esiste pacchetto con l'id fornito"));
			return "#";
		}

		return "packet_detail";

	}


	/**
	 * Metodo che elimina il pacchetto {@code pacchettoSelezionato} dalla lista dei pacchetti disponibili
	 * 
	 */
	public void eliminaPacchetto(){
		//TODO chiamata al metodo di eliminazione del pacchetto
		System.out.println("Managed Bean :Packet: - Eliminazione pacchetto: "+pacchettoSelezionato.getId());

		try {
			ejbSession.deletePacchetto(pacchettoSelezionato);
			FacesContext.getCurrentInstance().addMessage(null,
					new FacesMessage( "SUCCESFULLY", "Pacchetto eliminato correttamente"));
		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage(null,
					new FacesMessage( "ERRORE", e.getMessage().substring(0, e.getMessage().indexOf(":"))));
			System.out.print(e.getMessage());
		}
	}



	public String creaNuovoPacchetto(){
		System.out.println("Managed Bean :Packet: - Creazione nuovo pacchetto");

		if(nuovoPacchetto.getCitta() != null && nuovoPacchetto.getdataPartenzaAsString() != null &&
				nuovoPacchetto.getdataRitornoAsString() != null && nuovoPacchetto.getPrezzo() > 0)
			System.out.print(nuovoPacchetto.toString());
		else
			System.out.print("Manca qualcosa!" + nuovoPacchetto.toString());

		if(nuovoPacchetto.getTrasportAndata() != null){
			System.out.println("Trasporto Andata: \n" + nuovoPacchetto.getTrasportAndata().getIdTrasporto() + 
					" Da: "+ nuovoPacchetto.getTrasportAndata().getCittaPartenza().getName()+ " a: " + nuovoPacchetto.getTrasportAndata().getCittaArrivo().getName()
					+ "\n Data: " + nuovoPacchetto.getTrasportAndata().getDataAsString());
		}

		if(nuovoPacchetto.getTrasportRitorno() != null){
			System.out.println("Trasporto Ritorno: \n" + nuovoPacchetto.getTrasportRitorno().getIdTrasporto() +
					"Da: "+ nuovoPacchetto.getTrasportRitorno().getCittaPartenza().getName()+ " a: " + nuovoPacchetto.getTrasportRitorno().getCittaArrivo().getName()
					+ "\n Data: " + nuovoPacchetto.getTrasportRitorno().getDataAsString());
		}

		if(nuovoPacchetto.getEscursionis() != null){
			System.out.println("Escursioni:");

			if(nuovoPacchetto.getEscursionis().size() == 0){

				return "#";		//Lo faccio rimanere in questa pagina
			}
			for(EscursioneDTO c : nuovoPacchetto.getEscursionis()){
				System.out.println(c.getDescrizione());
			}
		}else {
			System.out.print("Escursioni: " + nuovoPacchetto.getEscursionis());
		}

		if(nuovoPacchetto.getAlloggi() != null){
			System.out.println("Alloggio Selezionato: " + nuovoPacchetto.getAlloggi().getDescrizione() +
					"\n Camera scelta: " +  nuovoPacchetto.getTipocamera());

			HttpServletRequest origRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();

			//Verifico se la pagina da cui mi arriva la richiesta di inserimento è quella della selezione dell'alloggio
			if(origRequest.getServletPath().contains("new_packet_alloggio")){


				try {
					UtenteDTO u = new UtenteDTO();
					u.setUsername(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName());
					nuovoPacchetto.setCreato_da(u);
					ejbSession.insertNewPacket(nuovoPacchetto);

					FacesContext.getCurrentInstance().addMessage("growl_new_packet",
							new FacesMessage( "SUCCESFULLY", "Pacchetto creato correttamente"));

					nuovoPacchetto = new PacchettoDTO();
				} catch (Exception e) {

					FacesContext.getCurrentInstance().addMessage("growl_new_packet_error",
							new FacesMessage( "ERRORE", e.getMessage().substring(0, e.getMessage().indexOf(":"))));

					System.out.print(e.getMessage());
				}
			}

		}


		System.out.print(nuovoPacchetto.getCategorie());
		if(nuovoPacchetto.getCategorie() != null)
			System.out.print("Categoria: " + nuovoPacchetto.getCategorie().getDescrizione() + " id:" + nuovoPacchetto.getCategorie().getIdCategoria());

		return "new_packet_next";
	}



	/**
	 * 
	 * Metodo chiamato per cancellare i dati del pacchetto creato
	 */
	public void eliminaDatiNuovoPacchetto(){
		nuovoPacchetto = new PacchettoDTO();
	}



	//PARTE CLIENT
	
	
	/**
	 * inizializzio la categoria "custom Cliente"
	 * 
	 * @return - la pagina di inizio customizzazione di un pacchetto 
	 * 			da parte di un cliente
	 */
	public String customPacchettoSelect(){
		
		
		this.clearNuovoPacchetto();
		
		nuovaCategoria.setDescrizione("custom Client");
		nuovaCategoria.setIdCategoria(3);
		nuovoPacchetto.setCategorie(nuovaCategoria);
		
		nuovoPacchetto.setCustom(1);
		nuovaCategoria = new CategoriaDTO();
		return "custom_packet";
		
	}
	
	

	/**
	 * 
	 * Metodo che permette di inviare una mail ad un indrizzo specificato
	 * con l'id del pacchetto contenuto nella variabile {@link #pacchettoSelezionato}
	 * @param email - indirizzo email a cui inviare l'invito
	 * 
	 */

	public void inviaInvito(String email){

		FacesContext.getCurrentInstance().addMessage("email",
				new FacesMessage(FacesMessage.SEVERITY_INFO, "Invio effettuato correttamente", 
						"Contenuto email: " + email +" per il pacchetto di id: "+ pacchettoSelezionato.getClientIdPkg()));

	}




	/**
	 * controllo che i dati siano inseriti
	 * 
	 * @return- la pagina di inserimento del trasporto andata
	 */
	public String customNuovoPacchettoInit(){
		System.out.println("Managed Bean :Packet: - Creazione nuovo pacchetto");

		if(nuovoPacchetto.getCitta() != null && nuovoPacchetto.getdataPartenzaAsString() != null &&
				nuovoPacchetto.getdataRitornoAsString() != null && nuovoPacchetto.getPrezzo() > 0)
			System.out.print(nuovoPacchetto.toString());
		else
			System.out.print("Manca qualcosa!" + nuovoPacchetto.toString());
		
		if (nuovoPacchetto.getdataPartenza().after(nuovoPacchetto.getdataRitorno())){
			
			return "#";
			
		}

		return "create_new_packet_trasporti_andata";

	}

	/**
	 * verifica che il trasporto della andata sia conforme con
	 * i dati inseriti nella customizzazione del pacchetto
	 * 
	 * @return-la pagina di inserimento del viaggio di ritorno
	 */
	public String customTrasportoAndataNuovoPacchetto(){
		if(nuovoPacchetto.getTrasportAndata() != null){
			System.out.println("Trasporto Andata: \n" +
					"Da: "+ nuovoPacchetto.getTrasportAndata().getCittaPartenza().getName()+ " a: " + nuovoPacchetto.getTrasportAndata().getCittaArrivo().getName()
					+ "\n Data: " + nuovoPacchetto.getTrasportAndata().getDataAsString());
		}

		
		
		return "create_new_packet_trasporti_ritorno";

	}


	/**
	 * si assicura che i dati inseriti siano conformi con i dati già inseriti
	 * riguardo i pacchetti
	 * @return- la pagina di inserimento dell'alloggio
	 */
	public String customTrasportoRitornoNuovoPacchetto(){
		if(nuovoPacchetto.getTrasportRitorno() != null){
			System.out.println("Trasporto Andata: \n" +
					"Da: "+ nuovoPacchetto.getTrasportRitorno().getCittaPartenza().getName()+ " a: " + nuovoPacchetto.getTrasportRitorno().getCittaArrivo().getName()
					+ "\n Data: " + nuovoPacchetto.getTrasportRitorno().getDataAsString());
		}

		return "create_new_packet_alloggio";
	}


	/**
	 * inserisce i dati nel Pacchetto selezionato e
	 *  verifica la consistenza con i dati pre inseriti
	 * @return- la pagina degli alloggi
	 */
	public String customEscursioniPacchetto(){

		if(nuovoPacchetto.getEscursionis() != null){
			System.out.println("Escursioni:");

			if(nuovoPacchetto.getEscursionis().size() == 0){

				return "#";		//Lo faccio rimanere in questa pagina
			}
			for(EscursioneDTO c : nuovoPacchetto.getEscursionis()){
				System.out.println(c.getDescrizione());
			}
		}else {
			System.out.print("Escursioni: " + nuovoPacchetto.getEscursionis());
		}
		
		inserisciPrezzoPktCustom();
		
		return "packet_custom_detail.xhtml";
	}


	/**
	 * inserisce l'alloggio e poi verifica
	 *  la consistenza con i dati preinseriti
	 * @return-la pagina di dettaglio del pacchetto
	 */
	public String customAllogiPacchetto(){


		if(nuovoPacchetto.getAlloggi() != null){
			System.out.println("Alloggio Selezionato: " + nuovoPacchetto.getAlloggi().getDescrizione() +
					"\n Camera scelta: " +  nuovoPacchetto.getTipocamera());
		}
		
		

		return "create_new_packet_escursione";

	}

	
	public void inserisciPrezzoPktCustom(){
		
		double prezzoFinale = 0;
		Iterator<EscursioneDTO> it_e = nuovoPacchetto.getEscursionis().iterator();
		
		
		int giorniSogg = (int) ((nuovoPacchetto.getdataRitorno().getTime()-nuovoPacchetto.getdataPartenza().getTime())/(1000*60*60*24));
		giorniSogg++;
		
		System.out.println("prezzo::"+nuovoPacchetto.getAlloggi().getPrezzo());
		System.out.println("giorniSogg::"+giorniSogg);
		prezzoFinale += (nuovoPacchetto.getTrasportAndata().getPrezzo()*numeroPersNuovoPacchetto);
		prezzoFinale += (nuovoPacchetto.getTrasportRitorno().getPrezzo()*numeroPersNuovoPacchetto);
		prezzoFinale += (nuovoPacchetto.getAlloggi().getPrezzo()*giorniSogg);
		
		
		
		
//		Date d = new Date();
//		Calendar cal = Calendar.getInstance();
//		d = nuovoPacchetto.getdataPartenza();
		
		
//		while((d.after(nuovoPacchetto.getdataPartenza()) && d.before(nuovoPacchetto.getdataRitorno()))||d.compareTo(nuovoPacchetto.getdataPartenza())==0||d.compareTo(nuovoPacchetto.getdataRitorno())==0){
//			
//			giorniSogg++;
//		
//	        cal.setTime(d);
//	        cal.add(Calendar.DATE, 1); //minus number would decrement the days
//	        d = cal.getTime();	
//			
//		}
		
		
		
		while(it_e.hasNext()){
			
			prezzoFinale += (it_e.next().getPrezzo()*numeroPersNuovoPacchetto);
			
		}
		
		nuovoPacchetto.setPrezzo(prezzoFinale);
	}


	/**
	 *  rende persistente l'acquisto e
	 *  rende persistente il pacchetto creato
	 * 
	 * @return-la pagina iniziale
	 */
	public String compraPacchettoCustom(){

		
		
		

		//rendi persistente 
		try {
			UtenteDTO u = new UtenteDTO();
			u.setUsername(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName());
			
			if (nuovoPacchetto.getCustom()!=1){
				nuovoPacchetto.setCategorie(categoriaSelezionata);
				nuovoPacchetto.setCreato_da(u);
				nuovoPacchetto.setCustom(0);
			}else{
				nuovoPacchetto.setDisponibilita(1);
				nuovoPacchetto.setCreato_da(u);
				nuovoPacchetto.setCustom_da(u);
				
				
			}
			
			
			ejbSession.insertNewPacketCustom(nuovoPacchetto);

			FacesContext.getCurrentInstance().addMessage("growl",
					new FacesMessage( FacesMessage.SEVERITY_INFO,"Acquisto completato", "Pacchetto acquistato correttamente"));

			
		} catch (Exception e) {

			FacesContext.getCurrentInstance().addMessage("growl",
					new FacesMessage( FacesMessage.SEVERITY_ERROR, "Errore nell'acquisto", e.getMessage().substring(0, e.getMessage().indexOf(":"))));

			System.out.print(e.getMessage());
		}
		
		
		
		
		//metto il pacchetto in quelli acquistati dal cliente
		AcquistoDTO a = new AcquistoDTO();
		UtenteDTO u = new UtenteDTO();		//Creo l'uttenteDTO dell'utente che sta comprando il pacchetto (setto lo username)
		u.setUsername(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName());
		a.setUtente(u);
		a.setNumeroAcquisti(1);
		a.setPacchetto(nuovoPacchetto);
		
		
		try {
			ejbSession.acquistaPacchetto(a);
			
			
			FacesContext.getCurrentInstance().addMessage("growl-message",
					new FacesMessage(FacesMessage.SEVERITY_INFO, "Dettaglio Acquisto", "Acquisto effettuato correttamente"));
			nuovoPacchetto = new PacchettoDTO();
		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage("growl-message",
					new FacesMessage(FacesMessage.SEVERITY_ERROR, "Attenzione!",
							e.getMessage().substring(0, e.getMessage().indexOf(":"))));
			
		}



		


		return "dashboard.xhtml";
	}



	/**
	 * 
	 * rende persistente l'acquisto
	 * 
	 * @return-pagina iniziale del cliente
	 */
	public String compra_pacchetto(String num){

		Integer n = new Integer(num);

		if(n<= pacchettoSelezionato.getDisponibilita()){

			System.out.println("Acquistato: " + pacchettoSelezionato.toString());

			//Creo l'acquistoDTO da passare all'EJB
			AcquistoDTO a = new AcquistoDTO();
			UtenteDTO u = new UtenteDTO();		//Creo l'uttenteDTO dell'utente che sta comprando il pacchetto (setto lo username)
			u.setUsername(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName());
			a.setUtente(u);
			a.setNumeroAcquisti(n);
			a.setPacchetto(pacchettoSelezionato);


			try {
				ejbSession.acquistaPacchetto(a);

				FacesContext.getCurrentInstance().addMessage("growl-message",
						new FacesMessage(FacesMessage.SEVERITY_INFO, "Dettaglio Acquisto", "Acquisto effettuato correttamente"));

			} catch (Exception e) {
				FacesContext.getCurrentInstance().addMessage("growl-message",
						new FacesMessage(FacesMessage.SEVERITY_ERROR, "Attenzione!",
								e.getMessage().substring(0, e.getMessage().indexOf(":"))));
			}


		}else{
			FacesContext.getCurrentInstance().addMessage("growl-message",
					new FacesMessage(FacesMessage.SEVERITY_WARN, "Attenzione!", "Disponibilità di pacchetti insufficiente"));

		}

		return "#";	

	}



	/**
	 * prende i vari servizi base del pacchetto
	 * e li inserisce nella giftList
	 * 
	 * @return-la pagina iniziale(vediamo)
	 */
	public String addToGiftList(){

		GiftListDTO help = new GiftListDTO();

		UtenteDTO us=new UtenteDTO();
		us.setUsername(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName());

		//inserisco il trasporto di andata
		help.setAcquistato(0);
		help.setAcquistatoDa("");
		help.setIdServizioBase(pacchettoSelezionato.getTrasportAndata().getIdTrasporto());

		help.setUsernameUtente(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName());

		help.setPacchetto(pacchettoSelezionato);
		help.setTipo_servizio_base(1);

		listaGiftList.add(help);

		help = new GiftListDTO();



		//inserisco il trasporto di ritorno
		help.setAcquistato(0);
		help.setAcquistatoDa("");
		help.setIdServizioBase(pacchettoSelezionato.getTrasportRitorno().getIdTrasporto());
		
		help.setUsernameUtente(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName());;

		help.setPacchetto(pacchettoSelezionato);
		help.setTipo_servizio_base(1);



		listaGiftList.add(help);

		help = new GiftListDTO();

		//inserisco l'alloggio
		help.setAcquistato(0);
		help.setAcquistatoDa("");
		help.setIdServizioBase(pacchettoSelezionato.getAlloggi().getIdAlloggio());

		help.setUsernameUtente(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName());;

		help.setPacchetto(pacchettoSelezionato);
		help.setTipo_servizio_base(2);


		listaGiftList.add(help);

		help = new GiftListDTO();


		// inserisco le escursioni

		Iterator<EscursioneDTO> it_e = pacchettoSelezionato.getEscursionis().iterator();
		EscursioneDTO aux = new EscursioneDTO();

		while (it_e.hasNext()){

			aux = it_e.next();

			help.setAcquistato(0);
			help.setAcquistatoDa("");
			help.setIdServizioBase(aux.getIdEscursione());

			help.setUsernameUtente(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName());;

			help.setPacchetto(pacchettoSelezionato);
			help.setTipo_servizio_base(3);

			listaGiftList.add(help);

			help = new GiftListDTO();


		}
		/*
		try {
			ejbSession.addPacket2GiftList(pacchettoSelezionato, us );
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 */

		System.out.println(listaGiftList.get(0).getIdServizioBase()+" "+listaGiftList.get(0).getTipo_servizio_base());
		System.out.println(listaGiftList.get(1).getIdServizioBase()+" "+listaGiftList.get(1).getTipo_servizio_base());
		System.out.println(listaGiftList.get(2).getIdServizioBase()+" "+listaGiftList.get(2).getTipo_servizio_base());
		System.out.println(listaGiftList.get(3).getIdServizioBase()+" "+listaGiftList.get(3).getTipo_servizio_base());


		try {
			gLEJB.addToGiftListEjb(listaGiftList);
		} catch (Exception e) {

			System.out.println("pacchetto già inserito");


		}
		return "cliente_packet_list";

	}





	/**
	 * 
	 * Metodo che aggiunge una nuova categoria
	 */
	public void addCategoria(){

		System.out.print("Inserisco questa nuova categoria: " + nuovaCategoria.getDescrizione());

		//TODO Inserire una chiamata all'EJB che gestisce le categorie
		try {
			ejbSession.insertNewCategoria(nuovaCategoria);
			FacesContext.getCurrentInstance().addMessage("new_cat_msg",
					new FacesMessage(FacesMessage.SEVERITY_INFO, "SUCCESFULLY", "Pacchetto creato correttamente"));

			nuovaCategoria = new CategoriaDTO();

		} catch (Exception e) {

			FacesContext.getCurrentInstance().addMessage("new_cat_msg",
					new FacesMessage( FacesMessage.SEVERITY_ERROR, "ERRORE", e.getMessage().substring(0, e.getMessage().indexOf(":"))));

			e.printStackTrace();
		}

	}



	//GETTERS E SETTERS

	public PacchettoDTO getPacchettoSelezionato() {
		return pacchettoSelezionato;
	}


	public void setPacchettoSelezionato(PacchettoDTO pacchettoSelezionato) {
		this.pacchettoSelezionato = pacchettoSelezionato;
	}

	public PacchettoDTO getNuovoPacchetto() {
		return nuovoPacchetto;
	}

	public void setNuovoPacchetto(PacchettoDTO nuovoPacchetto) {
		this.nuovoPacchetto = nuovoPacchetto;
	}




	public PacketBeanEJB getEjbSession() {
		return ejbSession;
	}




	public void setEjbSession(PacketBeanEJB ejbSession) {
		this.ejbSession = ejbSession;
	}



	public CittaDTO getCittaSelezionata() {
		return cittaSelezionata;
	}



	public void setCittaSelezionata(CittaDTO cittaSelezionata) {
		this.cittaSelezionata = cittaSelezionata;
	}



	public double getPrezzoMax() {
		return prezzoMax;
	}




	public void setPrezzoMax(double prezzoMax) {
		this.prezzoMax = prezzoMax;
	}




	public double getPrezzoMin() {
		return prezzoMin;
	}




	public void setPrezzoMin(double prezzoMin) {
		this.prezzoMin = prezzoMin;
	}




	public CategoriaDTO getCategoriaSelezionata() {
		return categoriaSelezionata;
	}




	public void setCategoriaSelezionata(CategoriaDTO categoriaSelezionata) {
		this.categoriaSelezionata = categoriaSelezionata;
	}




	public ArrayList<PacchettoDTO> getListaPacchettiFiltrati() {
		return listaPacchettiFiltrati;
	}




	public void setListaPacchettiFiltrati(ArrayList<PacchettoDTO> listaPacchettiFiltrati) {
		this.listaPacchettiFiltrati = listaPacchettiFiltrati;
	}

	public Date getDataPartenza() {
		return dataPartenza;
	}



	public void setDataPartenza(Date dataPartenza) {
		this.dataPartenza = dataPartenza;
	}



	public Date getDataRitorno() {
		return dataRitorno;
	}



	public void setDataRitorno(Date dataRitorno) {
		this.dataRitorno = dataRitorno;
	}



	public Date getCURRENT_DATE() {
		return CURRENT_DATE;
	}



	public void setCURRENT_DATE(Date cURRENT_DATE) {
		CURRENT_DATE = cURRENT_DATE;
	}


	public int getNumeroPersNuovoPacchetto() {
		return numeroPersNuovoPacchetto;
	}



	public void setNumeroPersNuovoPacchetto(int numeroPersNuovoPacchetto) {
		this.numeroPersNuovoPacchetto = numeroPersNuovoPacchetto;

		//Setto anche il corrispondente tipo di camera nel nuovoPacchetto

		switch(numeroPersNuovoPacchetto){
		case 1: nuovoPacchetto.setTipocamera("Singola"); break;
		case 2: nuovoPacchetto.setTipocamera("Doppia"); break;
		case 3: nuovoPacchetto.setTipocamera("Tripla"); break;
		case 4: nuovoPacchetto.setTipocamera("Quadrupla");
		}
	}



	public ArrayList<CategoriaDTO> complete(String q) {

		ArrayList<CategoriaDTO> help = new ArrayList<CategoriaDTO>();

		Iterator<CategoriaDTO> it = listaCategorie.iterator();
		CategoriaDTO c;
		while(it.hasNext()){
			c = it.next();
			if(c.getDescrizione().startsWith(q))
				help.add(c);
		}
		return help;
	}



	public void setListaCategorie(ArrayList<CategoriaDTO> listaCategorie) {
		this.listaCategorie = listaCategorie;
	}



	@Override
	public Object getAsObject(FacesContext context, UIComponent component,
			String value) {

		System.out.print("VALORE: " + value);

		listaCategorie.clear();
		listaCategorie.addAll(ejbSession.getAllCategorie());
		Iterator<CategoriaDTO> it = listaCategorie.iterator();
		CategoriaDTO c;
		while(it.hasNext()){
			c = it.next();
			if(c.getDescrizione().equalsIgnoreCase(value)){
				return c;
			}
		}

		return null;
	}



	@Override
	public String getAsString(FacesContext context, UIComponent component,
			Object value) {

		return ((CategoriaDTO)value).getDescrizione();
	}




	/**
	 * @return the listaGiftList
	 */
	public ArrayList<GiftListDTO> getListaGiftList() {
		return listaGiftList;
	}



	/**
	 * @param listaGiftList the listaGiftList to set
	 */
	public void setListaGiftList(ArrayList<GiftListDTO> listaGiftList) {
		this.listaGiftList = listaGiftList;
	}





	public CategoriaDTO getNuovaCategoria() {
		return nuovaCategoria;
	}



	public void setNuovaCategoria(CategoriaDTO nuovaCategoria) {
		this.nuovaCategoria = nuovaCategoria;
	}



	public double getMacPrezzoPack() {
		return maxPrezzoPack;
	}



	public void setMacPrezzoPack(double macPrezzoPack) {
		this.maxPrezzoPack = macPrezzoPack;
	}



	public StatoDTO getStatoSel() {
		return statoSel;
	}



	public void setStatoSel(StatoDTO statoSel) {
		this.statoSel = statoSel;
	}




}
